import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
//同步队列
// 和其他的 BlockingQueue不一样，SynchronousQueue 不存储元素
// put() 了一个元素，则下一步必须 take() 一个元素，否则不能再 put()进去值

public class SynchronousQueueDemo {
    public static void main(String[] args) {
        SynchronousQueue<String> synchronousQueue = new SynchronousQueue<>();
        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName() + " : put 1");
                synchronousQueue.put("1");
                System.out.println(Thread.currentThread().getName() + " : put 2");
                synchronousQueue.put("2");
                System.out.println(Thread.currentThread().getName() + " : put 3");
                synchronousQueue.put("3");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        },"thread1").start();

        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + " : take 1");
                synchronousQueue.take();
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + " : take 2");
                synchronousQueue.take();
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + " : take 3");
                synchronousQueue.take();
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        },"thread2").start();

    }
}
